#include "../game.h"
#include "pjas.h"

#include "bonde.h"
#include "lopare.h"
#include "hast.h"
#include "torn.h"
#include "kung.h"
#include "dam.h"

/*---------------------------------

Pjas::Pjas( bool spelare, short x, short y )
Konstruktor.
Argument: spelarens nummer, x-position och y-position

---------------------------------*/

Pjas::Pjas( bool spelare, short x, short y ) {
	this->spelare = spelare;
	xpos = x;
	ypos = y;
	flyttad = 0;
	hotad = 0;
	game->pjasArray[x][y] = this;
}

/*---------------------------------

Pjas::~Pjas()
virtual
Destruktor.

---------------------------------*/

Pjas::~Pjas() {
}

/*---------------------------------

Pjas::mojligtDrag( void )
overloadad, virtual
En pjäs kallar denna och skapar en array med alla positioner som pjäsen kan gå till.
Ersätts av pjäs-specifika funktioner.
Return: Sätter 0 för "kan inte gå" och 1 för "kan gå"

---------------------------------*/

void Pjas::mojligtDrag( void ) {

}

/*---------------------------------

Pjas::arPjasHotad( void )
Denna funktion går igenom alla positioner där en hotande pjäs
kan stå och ser om det finns en hotande pjäs. Om det gör det,
sätt hotad till 1 och returna hotad.
Return: bool hotad (0 om pjäsen ej hotad, 1 om pjäsen hotad)

---------------------------------*/

bool Pjas::arPjasHotad( void ) {
	return hotad;
}

/*---------------------------------

Pjas::existerarPjas( short x, short y )
Kollar om en pjäs kan gå till en viss ruta.
Kallas av void mojligtDrag-funktionerna, för annars
skulle jag behöva ha den här koden överallt.
Argument: en position x,y
Return: 0 om friend-pjäs står där, 1 om rutan är tom, 2 om en pjäs kan tas, 13-37 om nått gick åt skogen

---------------------------------*/

char Pjas::existerarPjas( short x, short y ) {

	// Det finns ingen pjäs på x,y
	if( game->pjasArray[x][y] == NULL ) {
		return TOM_RUTA;
	}
	// Det finns en fiendepjäs som kan tas på x,y
	if( game->pjasArray[x][y] != NULL && game->pjasArray[x][y]->spelare != this->spelare ) {
		game->pjasArray[x][y]->hotad = true;
		return HOTAR;
	}
	// Det finns en friend-pjäs på x,y
	if( game->pjasArray[x][y] != NULL && game->pjasArray[x][y]->spelare == this->spelare ) {
		return FRIEND_PJAS;
	}

	// ZOMFG IT ARE WRONG
	return 13-37;

}

/*---------------------------------

Pjas::mojligtDragRiktningar( char riktningar[8][2], char antal_riktningar )
Kollar möjliga drag för löpare, torn och dam
Argument: riktningar = En tvådimensionell array, x-offset och y-offset i olika riktningar man kan gå,
antal_riktningar = Antalet riktningar (storlek på arrayen...)

---------------------------------*/

void Pjas::mojligtDragRiktningar( char riktningar[8][2], char antal_riktningar ) {
	for( int i = 0; i < 8; i++ ) {
		for( int j = 0; j < 8; j++ ) {
			mojligaDrag[i][j] = NEJ;
		}
	}

	// Testa att gå åt antal_riktningar riktningar
	for( char* riktning=riktningar[0]; riktning<riktningar[antal_riktningar]; riktning+=2 ) {

		//Testa att gå i riktningen så länge man inte går utanför planen
		for( int x_test = xpos + riktning[0], y_test = ypos + riktning[1];
			x_test>=0 && x_test<=7 && y_test>=0 && y_test<=7;
			x_test += riktning[0], y_test += riktning[1] ) {

			// Sätt rätt element i mojligaDrag-arrayen till rätt värde och kolla om det står en pjäs där
			if( ( mojligaDrag[x_test][y_test] = Pjas::existerarPjas( x_test, y_test ) ) != TOM_RUTA ) {
				//Eftersom det står en pjäs ivägen här kan vi inte längre gå vidare i denna riktning
				break;
			}
		}
	}
}

/*---------------------------------

Pjas::rita( bool transparent, bool markerad )
Ritar en pjäs och ev. dess ruta
Argument: Transparent = om false, rita även bakgrund. Om markerad finns, rita i blå färg

---------------------------------*/

void Pjas::rita( bool transparent, bool markerad ) {
	if ( transparent == false ) {
		video.ritaRektangel( xpos*60, ypos*60, 60, 60, (markerad ? MARKERAD_FARG : RUT_FARG(xpos, ypos)));
	}
	video.ritaBild( xpos*60, ypos*60, 60, 60, bild );
}

